package pers.xiaojun.boot.module.system.convert;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.StrUtil;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import pers.xiaojun.boot.module.system.controller.oauth2.vo.OAuth2OpenAccessTokenRespVO;
import pers.xiaojun.boot.module.system.service.oauth2.dto.OAuth2TokenDTO;
import pers.xiaojun.boot.web.core.constants.TokenTypeConstants;

/**
 * OAuth 2.0 转换器
 *
 * @author xiaojun
 * @since 2025-10-21
 */
@Mapper
public interface OAuth2OpenConvert {

    OAuth2OpenConvert INSTANCE = Mappers.getMapper(OAuth2OpenConvert.class);

    /**
     * 转换 OAuth2TokenDTO -> OAuth2OpenAccessTokenRespVO
     */
    default OAuth2OpenAccessTokenRespVO toOpenToken(OAuth2TokenDTO oAuth2Token) {
        OAuth2OpenAccessTokenRespVO accessToken = BeanUtil.toBean(oAuth2Token, OAuth2OpenAccessTokenRespVO.class);
        // 使用空格分割 权限范围
        accessToken.setScope(StrUtil.join(StrUtil.SPACE, oAuth2Token.getScopes()));
        // 转换为秒级时间戳
        accessToken.setExpiresIn(LocalDateTimeUtil.toEpochMilli(oAuth2Token.getExpiresTime()) / 1000);
        // 设置Token类型为 bearer
        accessToken.setTokenType(TokenTypeConstants.BEARER);
        return accessToken;
    }

}
